package com.smart.community.region.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.smart.community.region.entity.Building;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;

/**
 * 楼栋数据访问接口
 *
 * @author Wu.Liang
 * @since 2024-12-21
 */
@Mapper
public interface BuildingMapper extends BaseMapper<Building> {

    /**
     * 根据楼栋编号查询楼栋
     * @param buildingNo 楼栋编号
     * @return 楼栋实体
     */
    Building selectByBuildingNo(@Param("buildingNo") String buildingNo);

    /**
     * 根据楼栋编号和社区ID查询楼栋
     * @param buildingNo 楼栋编号
     * @param communityId 社区ID
     * @return 楼栋实体
     */
    Building selectByBuildingNoAndCommunityId(@Param("buildingNo") String buildingNo, @Param("communityId") Long communityId);

    /**
     * 根据社区ID查询楼栋列表
     * @param communityId 社区ID
     * @return 楼栋列表
     */
    List<Building> selectByCommunityId(@Param("communityId") Long communityId);

    /**
     * 批量查询楼栋
     * @param buildingIds 楼栋ID列表
     * @return 楼栋列表
     */
    List<Building> selectBatchByIds(@Param("buildingIds") List<Long> buildingIds);

    /**
     * 根据用户权限查询楼栋列表
     * @param userId 用户ID
     * @return 有权限的楼栋列表
     */
    List<Building> selectByUserPermission(@Param("userId") Long userId);

    /**
     * 检查楼栋编号是否存在
     * @param buildingNo 楼栋编号
     * @param excludeId 排除的楼栋ID
     * @return 是否存在
     */
    Boolean existsByBuildingNo(@Param("buildingNo") String buildingNo, @Param("excludeId") Long excludeId);

    /**
     * 批量更新楼栋状态
     * @param buildingIds 楼栋ID列表
     * @param status 状态
     * @return 更新数量
     */
    Integer batchUpdateStatus(@Param("buildingIds") List<Long> buildingIds, @Param("status") Integer status);

    /**
     * 批量删除楼栋
     * @param buildingIds 楼栋ID列表
     * @return 删除数量
     */
    Integer batchDeleteByIds(@Param("buildingIds") List<Long> buildingIds);

    /**
     * 统计楼栋数量
     * @param communityId 社区ID（可选）
     * @return 楼栋数量
     */
    Long countBuildings(@Param("communityId") Long communityId);

    /**
     * 根据社区ID和楼栋名称查询楼栋
     * @param communityId 社区ID
     * @param buildingName 楼栋名称
     * @return 楼栋列表
     */
    List<Building> selectByCommunityIdAndBuildingName(@Param("communityId") Long communityId, @Param("buildingName") String buildingName);

    /**
     * 查询启用的楼栋列表
     * @param communityId 社区ID
     * @return 启用的楼栋列表
     */
    List<Building> selectEnabledBuildings(@Param("communityId") Long communityId);

    /**
     * 根据楼栋名称模糊查询
     * @param buildingName 楼栋名称
     * @return 楼栋列表
     */
    List<Building> selectByBuildingNameLike(@Param("buildingName") String buildingName);

    /**
     * 更新楼栋统计信息
     * @param buildingId 楼栋ID
     * @return 更新数量
     */
    Integer updateBuildingStats(@Param("buildingId") Long buildingId);

    /**
     * 统计楼栋下的单元数量
     * @param buildingId 楼栋ID
     * @return 单元数量
     */
    Long countByBuildingId(@Param("buildingId") Long buildingId);

    /**
     * 统计楼栋下的房户数量
     * @param buildingId 楼栋ID
     * @return 房户数量
     */
    Long countHouseholdsByBuildingId(@Param("buildingId") Long buildingId);

    /**
     * 根据楼栋编号列表和社区ID查询楼栋
     * @param buildingNos 楼栋编号列表
     * @param communityId 社区ID
     * @return 楼栋列表
     */
    List<Building> selectByBuildingNosAndCommunityId(@Param("buildingNos") List<String> buildingNos, @Param("communityId") Long communityId);

    /**
     * 批量插入楼栋
     * @param buildings 楼栋列表
     * @return 插入数量
     */
    Integer batchInsert(@Param("buildings") List<Building> buildings);
} 